from fastapi import FastAPI, HTTPException
from fastapi.middleware.cors import CORSMiddleware
from Error import *
from population_feature_new import *
from geography_new import *

app = FastAPI()

# 错误信息

err = NotFound()

#  跨域

# 允许的来源列表，确保包含你的前端开发服务器地址
origins = [
    "http://localhost:5173",  # 前端开发服务器地址
]

app.add_middleware(
    CORSMiddleware,
    allow_origins=origins,  # 允许的来源列表
    allow_credentials=True,  # 是否允许发送凭据（例如：cookies）
    allow_methods=["*"],  # 允许的所有HTTP方法，'*'表示全部
    allow_headers=["*"],  # 允许的所有HTTP头部，'*'表示全部
)


# 人口特征对象
population = Population()

population.getdata()

# 地理分布
geography = Geography()

geography.getdata()

# 第一页
#
# 1.人口统计特征


# 年龄
# 返回全部年份数据，按省份来查
# 参数：{province}
# 返回格式：
# {
#     年份(int):比例(float)
# }
# 例如：
# [
#    ...
#     {2021:1.235},
#     {2022:1.256},
#     {2023:1.89}
# ]
@app.get("/population_feature/age/{year}/database")
def age(year: int):
    try:
        re = population.Dic["age"][year]
    except:
        return errorToJson(err)
    else:
        return re


# 全国总人口
@app.get("/population_feature/population/database")
def allpopulation():

    try:
        re = population.Dic["population"]
    except:
        return errorToJson(err)
    else:
        return re

#  2023年每个省的人口
@app.get("/population_feature/population_of_lastyear/database")
def allpopulation():
    try:
        re =  population.Dic["lastyear"]
    except:
        return errorToJson(err)
    else:
        return re

# 男性年龄分布
# 查询男性人口分布，再按年份查
# 参数：{year} int类型
# 返回：
# [
#     年龄：比例
# ]
# 年龄：65-69岁，比例：小数*100，保留两位小数
# 例如：
# [
#     ...
#     {"65-69岁":2.06}
#     ...
# ]
@app.get("/population_feature/male/{year}/database")
def male(year: int):
    try:
        re = population.Dic["male"][year]
    except:
        return errorToJson(err)
    else:
        return re


# 女特征
# 与男性年龄分布一致
@app.get("/population_feature/female/{year}/database")
def female(year: int):
    try:
        re = population.Dic["female"][year]
    except:
        return errorToJson(err)
    else:
        return re

# 男女分别占比
@app.get("/population_feature/gender/{year}/database")
def gender(year: int):
    try:
        re = population.Dic["gender"][year]
    except:
        return errorToJson(err)
    else:
        return re


# 家庭结构
# 先按省份查，再按年份查
# 参数：/{province}/{year}，例如/山东省/2021，注意/china/2023中china是获取全国的
# 返回：
# [
#     ...
#     {"一人户家庭户":比例}
#     ...
# ]
# 比例，保留两位小数
@app.get("/population_feature/family/{city}/{year}/database")
def family(city:str, year: int):
    try:
        re = population.Dic["family"][city][year]
    except:
        return errorToJson(err)
    else:
        return re

# 新家庭数据
@app.get("/population_feature/family_new/{city}/{year}/database")
def family(city:str, year: int):
    try:
        re = population.Dic["family_new"][city][year]
    except:
        return errorToJson(err)
    else:
        return re


# 变化数据
@app.get("/population_feature/change/{city}/database")
def changeprovince(city: str):
    try:
        re = population.Dic["change"][city]
    except:
        return errorToJson(err)
    else:
        return re


#
# 第二页
# 2.地理分布

# 农村人口
@app.get("/geography/country/{city}/database")
def country(city: str):
    try:
        re = geography.Dic["country"][city]
    except:
        return errorToJson(err)
    else:
        return re


# 城市人口
@app.get("/geography/urban/{city}/database")
def country(city: str):
    try:
        re = geography.Dic["urban"][city]
    except:
        return errorToJson(err)
    else:
        return re


# 常驻人口按省份
@app.get("/geography/resident/{city}/database")
def country(city: str):
    try:
        re = geography.Dic["resident"][city]
    except:
        return errorToJson(err)
    else:
        return re

# 常驻人口按年份
@app.get("/geography/resident_year/{year}/database")
def country(year:int):
    try:
        re = geography.Dic["resident_year"][year]
    except:
        return errorToJson(err)
    else:
        return re

# 人口迁移
@app.get("/geography/migration/{city}/database")
def country(city: str):
    try:
        re = geography.Dic["migration"][city]
    except:
        return errorToJson(err)
    else:
        return re

# 人口迁移新
@app.get("/geography/migration_new/{year}/database")
def country(year:int):
    try:
        re = geography.Dic["migration_new"][year]
    except:
        return errorToJson(err)
    else:
        return re

# 人口密度
@app.get("/geography/density/{city}/database")
def country(city: str):
    try:
        re = geography.Dic["density"][city]
    except:
        return errorToJson(err)
    else:
        return re

# 人口密度新
@app.get("/geography/density_new/{year}/database")
def country(year: int):
    try:
        re = geography.Dic["density_new"][year]
    except:
        return errorToJson(err)
    else:
        return re

# 城市化率
@app.get("/geography/urbanization/{city}/database")
def country(city: str):
    try:
        re = geography.Dic["urbanization"][city]
    except:
        return errorToJson(err)
    else:
        return re

# 城市化率新
@app.get("/geography/urbanization_new/{year}/database")
def country(year:int):
    try:
        re = geography.Dic["urbanization_new"][year]
    except:
        return errorToJson(err)
    else:
        return re
